iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1
自我挑戰組

Hey! UIKit, 做個朋友吧~系列 第 3

Day 03: 利用UIButton的State來實作點擊後的按鈕變化吧~

  • 分享至 

  • xImage
  •  

為什麼今天標題這麼正常?

action

這個子標題聽起來好像很有power。
其實只是在實作按鈕點擊變化之前,我想先來講講如何指定按鈕的action。

上一篇文章有講到,建立button實體的方法,有從library裡拖拉button至storyboard,也有用程式碼實踐2種。
如果是從library拖拉的,需要使用@IBAction在程式碼裡指定button的回饋動作:

@IBAction func buttonAction(_ sender: UIButton) {
    //任何你想要button做的事>///<
}

這時你會看到@IBACtion前面有一個空心圓:

將空心圓拖拉至storyboard裡的button,就完成了連結。

如果button是用程式碼建立的話,則要先建立一個button回饋動作的function:

@objc func buttonAction(_ sender: UIButton) {
    //任何你想要button做的事>///<
}

再將你的button加入這個function(target):

newButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

其中for是一個UIEvent,決定了使用者對button進行怎樣的操作才會回饋動作。
一般都是touchUpInside,指的是使用者點擊按鈕後,在按鈕的內部移開手指後觸發動作。其他還有很多好玩的UIEvent,如果有機會再跟大家介紹。

State Config

接下來進入正題,來談談button的state。

state是表示button目前的狀態。如果沒有做任何設定,按鈕的state會是default(對應UIControl.state為normal)。當按鈕被選取時,狀態會從normal變成highlighted。

而常見的點擊後會變化的按鈕就是利用給normal和highlighted時不同的設定來實現的。現在來實作一個簡單的例子。初始化button後,在viewDidLoad()的function裡加入下列程式碼:

//按鈕狀態為normal時,內容為normal,字體顏色白色
newButton.setTitle("normal", for: .normal)
newButton.setTitleColor(UIColor.white, for: .normal)

//按鈕狀態為highlighted時,內容為highlighted,字體顏色紅色
newButton.setTitle("highlighted", for: .highlighted)
newButton.setTitleColor(UIColor.red, for: .highlighted)

而按鈕的狀態如果為selected,一開始就會呈現被選取的狀態,點擊時則是取消選取,state會變回normal。

//設定按鈕的初始望態為selected
newButton.isSelected = true

newButton.setTitle("selected", for: .selected)
newButton.setTitleColor(UIColor.blue, for: .selected)

這樣看起來,按鈕狀態一開始設為normal跟設為selected,做出來的效果好像差不多。
那selected到底是來幹嘛用的呢?
其實button的回饋動作還有一個很常見的應用:check list,可以讓按鈕點擊後轉換成被選取的狀態,同時切換不同的圖片及title。
以下有個簡單的小實例,建立一個切換selected的function:

@objc func switchSelected(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected
}

並加入newButton:

newButton.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)


其實這個順序是(初始)normal>(點擊)highlighted>(放開)selected>(再點擊)>(再放開)normal
可是錄gif的時候鼠標會不見啊~~我不知道怎麼顯示啊~~誰來救救我QQ

而按鈕的state若為disable,則會呈現無法被選取的狀態,可配合判斷式讓按鈕在某些條件下才可以被選取。常用的像是輸入資料時,如果沒有填進任何文字,送出資料的按鈕就無法被點選:

override func viewDidLoad() {
    newButton.isEnabled = false
    //為button指定一個action(function enterName),會在textField的內容被更動時觸發
    nameTextField.addTarget(self, action: #selector(enterName), for: .editingChanged)
}

@objc func enterName(_ sender: UITextField) {
    //若textField內為空字串,則按鈕無法被選取
    if sender.text == "" {
        newButton.isEnabled = false
    } else {
        newButton.isEnabled = true
    }
}

那今天就到此為止,再講下去我的存貨就要不夠啦...
明天是UIButton的最終回,會介紹UIButton提供的一些特效以及支援功能。


上一篇
Day 02: 你就是UIButton嗎?久仰久仰!
下一篇
Day 04: 你所不知道的UIButton的另一面......
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言